from growthAnalyzer import models
from django.db import transaction
import numpy as np
from growthAnalyzer.service import ossTool


# 从深度图片获取深度信息，并且转换为.npy文件
def depth_binary_to_npy(depth_binary_data, output_npy_path):
    """
    从深度图像的二进制数据获取深度信息并保存为.npy文件。

    参数:
        depth_binary_data (bytes): 深度图像的二进制数据。
        output_npy_path (str): 输出.npy文件路径。

    返回:
        str: 保存的.npy文件路径。
    """
    # 1. 解析深度图像二进制数据以获取深度信息
    depth_data = np.frombuffer(depth_binary_data, dtype=np.float32)

    # 如果深度数据中存在负值，你可能需要进行额外处理，
    # 比如对所有负值进行裁剪或替换为特定值

    # 2. 将深度信息保存为.npy文件
    np.save(output_npy_path, depth_data)

    return output_npy_path


# # 示例用法
# depth_binary_data = b'\x00\x00\x80\xbf\x00\x00\x80\xbf...'  # 你的深度图像二进制数据
# output_npy_path = 'depth_data.npy'  # 输出.npy文件路径
# result_npy_path = depth_binary_to_npy(depth_binary_data, output_npy_path)
# print("深度信息已保存为:", result_npy_path)


# 根据图片利用算法来预测体尺
def forecastBodySizeByImg(webcamImg, bgremovedIm, colorImg, depthImg, contentType, userId):
    # 调用算法模型进行体尺预测
    forecastBodySizeData = []

    # 开启事务管理
    with transaction.commit():
        # 连接 OSS 客户端
        oss_client = ossTool.connect_oss_client()

        # 保存图片到 OSS
        url1 = ossTool.save_to_oss(contentType, oss_client, webcamImg, "predicting_duck_images")
        url2 = ossTool.save_to_oss(contentType, oss_client, bgremovedIm, "predicting_duck_images")
        url3 = ossTool.save_to_oss(contentType, oss_client, colorImg, "predicting_duck_images")
        url4 = ossTool.save_to_oss(contentType, oss_client, depthImg, "predicting_duck_images")
        # 将预测记录保存到数据库
        models.ForecastBodySizeLog(webcam_img=url1, bgremoved_img=url2, color_img=url3,
                                   depth_img=url4, data=forecastBodySizeData,
                                   user_id=userId).save()
    # 返回响应
    return forecastBodySizeData


# 查看预测记录
def getPredictionRecords(userId):
    forecastBodySizeLog = models.ForecastBodySizeLog.objects.filter(user_id=userId).values()
    return list(forecastBodySizeLog)
